Profile picture

[Jenkins] SSH Agent 인증 삽질기

JaehyoJJAng2025년 12월 25일

개요

Jenkins 파이프라인에서 ssh-agent를 사용해 원격 서버로 접속하는 작업을 구상하던 중에,

Permission denied (publickey)error in libcrypto 에러를 연달아 마주쳤습니다.


문제 자체는 단순했지만, SSH 키 인증에 대한 착각 때문에 원인을 파악하는 데 조금 시간이 걸렸네요..


이 글을 통해서

  • 내가 어떤 부분을 착각했는지
  • SSH 키 인증이 실제로 어떻게 동작하는지
  • Jenkins + ssh-agent 환경에서 무엇을 설정해야 하는지
  • 최종적으로 어떻게 해결했는지

를 순서대로 정리해보고자 합니다.


문제 상황

Jenkins 파이프라인에서 다음과 같이 SSH 접속을 시도하였습니다.

sshagent(credentials: ['ssh-key']) {
    sh 'ssh jhlee37@192.168.219.111 echo "Hello"'
}

하지만 파이프라인 로그에는 다음과 같은 에러가 발생했네요.
image


이후 키를 바꿔가며 시도하던 중에 다음 에러도 발생하였습니다.
image


착각했던 부분

제가 처음에 가지고 있던 생각은 이랬습니다.


"원격 서버에서 ssh-keygen으로 키 페어를 만들었고,

그 개인키(id_rsa)를 Jenkins credentials에 등록했으니

Jenkins에서 원격 서버로 바로 접근이 되어야 하는거 아닌가?"


이 생각의 착각은 단 한가지였죠.

  • SSH 키를 "어디에서 생성했는지"가 중요하다고 착각한 것!

SSH 키 인증 실제 구조

SSH 키 인증은 생성 위치와 무관하게 다음 구조로만 동작합니다.

[접속하는 쪽 (Client)]  → private key
[접속받는 쪽 (Server)]  → public key (authorized_keys)

즉,

  • Jenkins는 SSH 클라이언트
  • 원격 서버는 SSH 서버

라는 점이 핵심인거죠.


SSH 인증 흐름

  1. Jenkins가 private key로 인증을 시도
  2. 원격 서버는 ~/.ssh/authorized_keys에 등록된 public key들과 비교
  3. 일치하는 public key가 있으면 접속 허용

-> 서버는 private key를 절대 보지 않는다!!


그래서 반드시 필요한 작업

1. 키 페어 생성

원격 서버에서 생성했지만, 사실 그 위치는 중요하지 않습니다.

ssh-keygen -t rsa -b 4096 -m PEM -f jenkins_id_rsa

생성 결과

jenkins_id_rsa        # 개인키 (private key)
jenkins_id_rsa.pub    # 공개키 (public key)

2. 개인키 -> Jenkins credentials 등록

Jenkins 관리 화면에서

  • Kind: SSH Username with private key
  • Username: jhlee37
  • Private Key: jenkins_id_rsa 내용

-> Jenkins가 접속 주체이므로 개인키는 Jenkins가 가진다


3. 공개키 -> 원격 서버에 등록

cat jenkins_id_rsa.pub >> ~/.ssh/authorized_keys

최종 검증!

위 조건에 맞춰 다시 파이프라인을 실행해봤더니 결과는?
image
성공!!

    Tag -

Loading script...